// 栈是一种 后进先出 的有序集合

// 创建一个基于 数组的栈
class Stack{ 
    constructor(){
        this.items = [];
    }

    // 向栈添加元素
    push(element){ 
        this.items.push(element);
    }

    // 移除栈元素
    pop(){ 
        return this.items.pop();
    }

    // 查看栈顶元素
    peek(){ 
        return this.items[this.items.length - 1];
    }

    // 检查栈是否为空
    isEmpty(){ 
        return this.items.length === 0;
    }

    // 查看size
    size(){ 
        return this.items.length;
    }

    // 清空栈元素
    clear(){ 
        this.items = [];
    }
}

// 使用Stack 类
let stack = new Stack();

// 基于JS 对象的 Stack 类
class Stack{ 
    constructor(){ 
        this.count = 0;
        this.items = {};
    }
    // 方法
    // 插入元素  键值对插入对象
    push(element){ 
        this.items[this.count] = element;
        this.count++;
    }
    size(){
        return this.count;
    }
    // 验证是否为空
    isEmpty(){ 
        return this.count === 0;
    }

    // 弹出元素
    pop(){
        if(this.isEmpty()){
            return undefined;
        }
        this.count--;
        const res = this.items[this.count];
        delete this.items[this.count];
        return res;
    }

    peek(){ 
        if(this.isEmpty()) return undefined;
        return this.items[this.count - 1];
    }

    clear(){ 
        this.items = {};
        this.count = 0;
    }

    // 创建toString 方法
    toString(){
        if(this.isEmpty){
            return '';
        }
        let objString = `${this.items[0]}`;
        for(let i = 0; i < this.count; i++){
            objString = `${objString},${this.items[i]}`;
        }
        return objString;
    }
}

// 保护数据内部元素
// 下划线命名约定： 使用下划线命名约定来标记一个属性为私有属性
class Stack{ 
    constructor(){ 
        this._count = 0;
        this._items = {};
    }
}

// 有一种数据类型可以确保属性是私有的 WeakMap 可以存储键值对 键是对象，值是任意数据类型

// 新增的私有 属性提案，直接在类中声明JS类属性并进行初始化
class Stack{ 
    #count = 0;
    #items = {};
    // 通过添加 # 声明私有属性
}


/**
 * 用栈解决问题
 * 从十进制到二进制
 */

function decimalToBinary(decNumber){ 
    const remStack = new Stack();
    let number = decNumber;
    let rem;
    let binaryString = '';

    while(number > 0){ 
        rem = Math.floor(number % 2);
        remStack.push(rem);
        number = Math.floor(number / 2);
    }

    while(!remStack.isEmpty()){ 
        binaryString += remStack.pop().toString();
    }

    return binaryString;
}